昨天還少講了一個最最最常用到的 x-model。如同他的樣子,跟 v-model、wire:model 一樣都是拿來綁定資料用的。由於前面也有介紹過 Livewire 的 wire:model 了,用起來跟 AlpineJS 的也都差不多,就邊看邊複習一下吧!
很方便的用於綁定<input>資料,當輸入時也會同步更新放在 x-model 中的值。當然在其他地方更新該值的話,放在<input>中的值也會隨之變化。
<div x-data="{ message: '' }">
<input type="text" x-model="message">
<span x-text="message">
</div>
x-model 能用在以下的元素:
<input type="text">
<textarea>
<input type="checkbox">
<input type="radio">
<select>
<input type="text" x-model="message">
<textarea x-model="message"></textarea>
預設的話值會是 Boolean 型態。
<input type="checkbox" id="checkbox" x-model="show">
多選的話會存成陣列,但記得宣告時預設值要給陣列[],不然一樣會變 Boolean。
<div x-data="{ colors: [] }">
<input type="checkbox" value="red" x-model="colors">
<input type="checkbox" value="orange" x-model="colors">
<input type="checkbox" value="yellow" x-model="colors">
</div>
<input type="radio" value="yes" x-model="answer">
<input type="radio" value="no" x-model="answer">
Answer: <span x-text="answer"></span>
<select x-model="color">
<option>Red</option>
<option>Orange</option>
<option>Yellow</option>
</select>
Color: <span x-text="color"></span>
這個單元不並陌生,因為我們在 Livewire 中的 wire:model 也有提到過類似的修飾功能。
.lazy在預設的狀況下,在文字輸入匡 <input> 中每輸入一個字都會觸發一次 x-model 的更新,這樣會導致打字時畫面閃爍以及延遲等問題,不過我們能夠透過 .lazy 來改善這問題。.lazy 會在滑鼠聚焦移開輸入匡時才使 x-model 的值來更新。
<input type="text" x-model.lazy="title">
.number可以使文字輸入匡<input>輸入的值自動轉為數字。輸入非數字的字元時將不會觸發更新。
<input type="text" x-model.number="age">
.debounce..debounce 能在固定時間去觸發 x-model 的更新,預設為 250ms。
<input type="text" x-model.debounce="search">
如果要更改更新的頻率直接加在後在就可以了,如 x-model.debounce.1000ms
.throttle跟上面的 .debounce 非常類似,但差別是 .throttle 是限制在更新後的指定秒數內不做更新的偵測,預設也是 250ms。
<input type="text" x-model.throttle="search">
因此假設設定為 1000ms 當你快速輸入 123 並在一千毫秒內多打幾個字變成 12345,結果值仍然會是 123。必須到一千毫秒後再繼續輸入成 123456 這時值才會跟著更新。